package cscalendar.classes;

import java.util.Calendar;

/**
 * CSCalendarHelper menyediakan method static untuk diakses, method yang
 * disediakan berhubungan dengan perhitungan calendar
 *
 * @author Muqtafi Akhmad
 */
public class CSCalendarHelper {

    /**
     * konstanta jumlah hari dalam seminggu
     */
    public static int DAY_IN_WEEK_MAX = 7;
    /**
     * konstanta jumlah minggu maksimal dalam sebulan
     */
    public static int WEEK_IN_MONTH_MAX = 6;

    /**
     * mengembalikan true jika tahun adalah tahun kabisat
     *
     * @param year tahun
     * @return true jika tahun kabisat
     */
    public static boolean isYearKabisat(int year) {
        if (year % 4 == 0) {
            if (year % 100 == 0) {
                if (year % 400 == 0) {
                    return true;
                } else {
                    return false;
                }
            } else {
                return true;
            }
        } else {
            return false;
        }
    }

    /**
     * mengembalikan jumlah hari maksimal dalam sebuah bulan dan tahun yang
     * diberikan
     *
     * @param month bulan input
     * @param year tahun input
     * @return jumlah hari maksimal
     */
    public static int maxDaysInMonth(int month, int year) {
        switch (month) {
            case 1: {
                return 31;
            }
            case 2: {
                if (isYearKabisat(year)) {
                    return 29;
                } else {
                    return 28;
                }
            }
            case 3: {
                return 31;
            }
            case 4: {
                return 30;
            }
            case 5: {
                return 31;
            }
            case 6: {
                return 30;
            }
            case 7: {
                return 31;
            }
            case 8: {
                return 31;
            }
            case 9: {
                return 30;
            }
            case 10: {
                return 31;
            }
            case 11: {
                return 30;
            }
            case 12: {
                return 31;
            }
            default: {
                return 0;
            }
        }
    }

    /**
     * mengembalikan hari pertama dari bulan yang diinputkan
     *
     * @param year tahun input
     * @param month bulan input
     * @return hari pertama dalam bulan input
     */
    public static int getFirstDay(int year, int month) {
        Calendar ref = Calendar.getInstance(), now = Calendar.getInstance();
        // referensi ke awal calendar, yaitu tanggal 1 Januari 1990
        ref.set(Calendar.YEAR, 1990);
        ref.set(Calendar.MONTH, 0);
        ref.set(Calendar.DATE, 1);
        ref.set(Calendar.HOUR, 0);
        ref.set(Calendar.MINUTE, 0);
        ref.set(Calendar.SECOND, 0);
        // calendar bagi awal bulan berdasarkan bulan dan tahun input
        now.set(Calendar.YEAR, year);
        now.set(Calendar.MONTH, month - 1);
        now.set(Calendar.DATE, 1);
        now.set(Calendar.HOUR, 0);
        now.set(Calendar.MINUTE, 0);
        now.set(Calendar.SECOND, 0);
        // hari pertama dari bulan
        int dayDiff = (int) ((now.getTimeInMillis() - ref.getTimeInMillis()) / (60 * 60 * 24 * 1000));
        return (dayDiff % 7) + 1;
    }
}
